const path = require('path')
const svgCaptcha = require('svg-captcha')
const createError = require('http-errors')
const accountModel = require(path.join(__dirname,"../model/accountModel"))
const cartModel = require(path.join(__dirname,"../model/cartModel"))
const config = require(path.join(__dirname,"../config"))

/**
 * 获取登录页面
 */
exports.getLoginPage = (req,res) => {
    // 生成验证码
    const captcha = svgCaptcha.createMathExpr({width:108,height:32,fontSize:32})
    // 保存验证码到session中
    req.session.captchaText = captcha.text
    // 渲染页面的时候，提供验证码
    res.locals.captcha = captcha.data
    // 把来源url也渲染到页面上，但是把它隐藏起来
    res.locals.returnUrl = req.query.returnUrl

    res.render(path.join(__dirname,"../views/login.art"))
}

/**
 * 处理登录操作
 */
exports.login = (req,res,next) => {
    // 1、解构赋值
    const {username,password,captcha,returnUrl} = req.body

    Promise.resolve().then(()=>{
        // 2、验证表单完整性
        if (!(username && password && captcha)){
            throw createError(400,'请输入完整')
        }

        // 3、验证验证码
        if (req.session.captchaText != captcha){
            throw createError(400,'验证码错误')
        }

        // 3、校验用户名或密码
        return accountModel.login({username,password})
    }).then(user=>{
        if (!(user && user.id)) {
            throw createError(400,'用户名或是密码错误')
        }

        // 1、保存用户信息
        req.session.user = user

        // 2、处理自动登录
        if (req.body.auto == 1){
            // 把用户id和加密知之后的密码存储到客户端cookies，下次自动带过来
            const userInfo = {uid:user.id,password:user.password}
            const expires = new Date(Date.now() + config.cookie.remember_cookie_expires_time)
            res.cookie(config.cookie.remember_cookie_key,JSON.stringify(userInfo),{expires})
        }

        // 3、同步cookies中的商品信息到服务器
        const cartCookie = req.cookies[config.cookie.cart_cookie_key] || '[]'
        const cartList = JSON.parse(cartCookie)
        const promiseArr = cartList.map(item=>cartModel.add(user.id,item.goodsId,item.amount))

        return Promise.all(promiseArr)
    }).then(()=>{// 同步商品信息成功之后的回调
        // 1、清空浏览器端cookies中保存的商品信息
        res.clearCookie(config.cookie.cart_cookie_key)

        // 2、清空session中的验证码
        req.session.captchaText = null

        // 3、如果有来源地址，则去来源地址，否则走个人中心
        res.redirect(returnUrl || '/member')
    }).catch(err=>{ //统一进行错误处理
        // console.log(err)
        if (err.status === 400){// 自己抛出的
            res.locals.errmsg = err.message
        } else {
            res.locals.errmsg = "登录失败"
        }

        // 重新生成验证码
        const captcha = svgCaptcha.createMathExpr({width:108,height:32,fontSize:32})
        // 保存验证码到session中
        req.session.captchaText = captcha.text
        // 渲染页面的时候，提供验证码
        res.locals.captcha = captcha.data
        // 渲染用户名和密码
        res.locals.username = username
        res.locals.password = password
        res.render(path.join(__dirname,"../views/login.art"))
    })
}
